//-------------------------------------------------------------------------------------------------------
//
// Vocal Remover
//
// Wtyczka usuwajaca wokal z stereofonicznych nagran muzycznych
//
//
// Filename     : rbjfilter.h
//
//-------------------------------------------------------------------------------------------------------

#ifndef __Rbj_filtr__  //zabezpieczenie przed wielokrotnym dodawaniem
#define __Rbj_filtr__

#include <math.h>

class Rbjfiltr
{
public:
	
	Rbjfiltr()
	{
		// czyszczenie wspolczynnikow filtru
		b0a0=b1a0=b2a0=a1a0=a2a0=0.0;
		
		// czyszczenie buforow
		ou1=ou2=in1=in2=0.0f;	
	};

	float filter(float in0)
	{
		// filtr
		float const yn = b0a0*in0 + b1a0*in1 + b2a0*in2 - a1a0*ou1 - a2a0*ou2;

		// przesuwanie probek w buforach
		in2=in1;
		in1=in0;
		ou2=ou1;
		ou1=yn;

		// zwracanie probki wyjsciowej
		return yn;
	};

	void calc_filter_coeffs(int const type,double const frequency,double const sample_rate,double const q,double const db_gain)
	{
		// wartosc pi
		double const temp_pi=3.1415926535897932384626433832795;
		
		// tymczasowe zmienne dla wspolczynnikow
		double alpha,a0,a1,a2,b0,b1,b2;

		double const A		=	pow(10.0,(db_gain/40.0));
		double const omega	=	2.0*temp_pi*frequency/sample_rate;
		double const tsin	=	sin(omega);
		double const tcos	=	cos(omega);
			
		alpha=tsin/(2.0*q);

		double const beta	=	sqrt(A)/q;
			
			
		// lowshelf - wybor typu pierwszym argumentem metody
		if(type==1)
			{
				b0=float(A*((A+1.0)-(A-1.0)*tcos+beta*tsin));
				b1=float(2.0*A*((A-1.0)-(A+1.0)*tcos));
				b2=float(A*((A+1.0)-(A-1.0)*tcos-beta*tsin));
				a0=float((A+1.0)+(A-1.0)*tcos+beta*tsin);
				a1=float(-2.0*((A-1.0)+(A+1.0)*tcos));
				a2=float((A+1.0)+(A-1.0)*tcos-beta*tsin);
			}

		// hishelf - wybor typu pierwszym argumentem metody
		if(type==2)
			{
				b0=float(A*((A+1.0)+(A-1.0)*tcos+beta*tsin));
				b1=float(-2.0*A*((A-1.0)+(A+1.0)*tcos));
				b2=float(A*((A+1.0)+(A-1.0)*tcos-beta*tsin));
				a0=float((A+1.0)-(A-1.0)*tcos+beta*tsin);
				a1=float(2.0*((A-1.0)-(A+1.0)*tcos));
				a2=float((A+1.0)-(A-1.0)*tcos-beta*tsin);
			}
		

		// wpisanie wspolczynnikow filtru
		b0a0=float(b0/a0);
		b1a0=float(b1/a0);
		b2a0=float(b2/a0);
		a1a0=float(a1/a0);
		a2a0=float(a2/a0);
	};

private:

	// deklaracja wspolczynnikow filtru
	float b0a0,b1a0,b2a0,a1a0,a2a0;

	// bufory
	float ou1,ou2,in1,in2;
};

#endif
//EOF